å ç¢ãªJavaScriptãã¹ãã€ã³ãã©ã®å®è£ ã¬ã€ãããã¬ãŒã ã¯ãŒã¯éžå®ãã»ããã¢ããããã¹ããã©ã¯ãã£ã¹ãCIãç¶²çŸ ããä¿¡é Œæ§ã®é«ãã³ãŒããå®çŸããŸãã
JavaScriptãã¹ãã€ã³ãã©ã¹ãã©ã¯ãã£ïŒãã¬ãŒã ã¯ãŒã¯å®è£ ã¬ã€ã
仿¥ã®ããŒã¹ã®éããœãããŠã§ã¢éçºç°å¢ã«ãããŠãJavaScriptã³ãŒãã®å質ãšä¿¡é Œæ§ã確ä¿ããããšã¯æãéèŠã§ããé©åã«å®çŸ©ããããã¹ãã€ã³ãã©ã¹ãã©ã¯ãã£ã¯ããã®ç®æšãéæããããã®åºç€ãšãªããŸãããã®ã¬ã€ãã§ã¯ããã¬ãŒã ã¯ãŒã¯ã®éžå®ãã»ããã¢ããããã¹ããã©ã¯ãã£ã¹ãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒCIïŒã·ã¹ãã ãšã®çµ±åãŸã§ãå ç¢ãªJavaScriptãã¹ãã€ã³ãã©ã¹ãã©ã¯ãã£ãå®è£ ããæ¹æ³ã®å æ¬çãªæŠèŠã説æããŸãã
ãªãJavaScriptãã¹ãã€ã³ãã©ã¹ãã©ã¯ãã£ãéèŠãªã®ãïŒ
匷åºãªãã¹ãã€ã³ãã©ã¹ãã©ã¯ãã£ã¯ã以äžã®ãããªæ°å€ãã®å©ç¹ããããããŸãïŒ
- æ©æã®ãã°æ€åºïŒéçºã©ã€ããµã€ã¯ã«ã®æ©ã段éã§ãã°ãç¹å®ãä¿®æ£ããããšã§ãã³ã¹ããåæžããåé¡ãæ¬çªç°å¢ã«å°éããã®ãé²ããŸãã
- ã³ãŒããžã®ä¿¡é Œæ§åäžïŒå æ¬çãªãã¹ãã¯ã³ãŒãã®æ©èœã«å¯Ÿããä¿¡é Œæ§ãæäŸãããªãã¡ã¯ã¿ãªã³ã°ãã¡ã³ããã³ã¹ã容æã«ããŸãã
- ã³ãŒãå質ã®åäžïŒãã¹ãã¯ãéçºè ãããã¯ãªãŒã³ã§ãã¢ãžã¥ãŒã«åããããã¹ãããããã³ãŒããæžãããšã奚å±ããŸãã
- éçºãµã€ã¯ã«ã®é«éåïŒèªåãã¹ãã¯è¿ éãªãã£ãŒãããã¯ã«ãŒããå¯èœã«ããéçºãµã€ã¯ã«ãå éãããçç£æ§ãåäžãããŸãã
- ãªã¹ã¯ã®è»œæžïŒå ç¢ãªãã¹ãã€ã³ãã©ã¹ãã©ã¯ãã£ã¯ããªã°ã¬ãã·ã§ã³ãäºæãã¬åäœãå°å ¥ãããªã¹ã¯ã軜æžããŸãã
ãã¹ããã©ããããçè§£ãã
ãã¹ããã©ãããã¯ããã¹ãã®åãçµã¿ãæ§é åããããã®æçšãªã¢ãã«ã§ããããã¯ã倿°ã®ãŠããããã¹ããäžçšåºŠã®æ°ã®çµ±åãã¹ãããããŠå°æ°ã®ãšã³ãããŒãšã³ãïŒE2EïŒãã¹ããæã€ã¹ãã§ããããšã瀺åããŠããŸãã
- ãŠããããã¹ãïŒãããã®ãã¹ãã¯ã颿°ãã³ã³ããŒãã³ããªã©ã®åã ã®ã³ãŒãåäœã«çŠç¹ãåœãŠãŸããé«éã§ãåé¢ãããŠãããç°¡åã«æžããã¹ãã§ãã
- çµ±åãã¹ãïŒãããã®ãã¹ãã¯ãã¢ãžã¥ãŒã«ããµãŒãã¹ãªã©ãã·ã¹ãã ã®ç°ãªãéšåéã®çžäºäœçšãæ€èšŒããŸãã
- ãšã³ãããŒãšã³ãïŒE2EïŒãã¹ãïŒãããã®ãã¹ãã¯ãå®éã®ãŠãŒã¶ãŒã·ããªãªãã·ãã¥ã¬ãŒãããã¢ããªã±ãŒã·ã§ã³å šäœãæåããæåŸãŸã§ãã¹ãããŸããéåžžããŠããããã¹ããçµ±åãã¹ããããå®è¡ãé ããèšè¿°ãè€éã§ãã
ãã¹ããã©ãããã«åŸãããšã§ãå®è¡ã®é ãE2Eãã¹ãã倿°ç¶æãããªãŒããŒããããæå°éã«æããªãããå æ¬çãªã«ãã¬ããžã確ä¿ããããšãã§ããŸãã
JavaScriptãã¹ããã¬ãŒã ã¯ãŒã¯ã®éžæ
åªããJavaScriptãã¹ããã¬ãŒã ã¯ãŒã¯ãããã€ãå©çšå¯èœã§ããæé©ãªéžæã¯ãç¹å®ã®ããŒãºãšãããžã§ã¯ãèŠä»¶ã«ãã£ãŠç°ãªããŸããããã§ã¯ãããã€ãã®äººæ°ã®ãããªãã·ã§ã³ã®æŠèŠã玹ä»ããŸãïŒ
Jest
Jestã¯Facebookã«ãã£ãŠéçºãããã人æ°ã®ãã倿©èœãªãã¹ããã¬ãŒã ã¯ãŒã¯ã§ãã䜿ãããããå æ¬çãªæ©èœã»ãããåªããããã©ãŒãã³ã¹ã§ç¥ãããŠããŸããJestã«ã¯ã以äžã®ããã®çµã¿èŸŒã¿ãµããŒããä»å±ããŠããŸãïŒ
- ã¢ããã³ã°ïŒã³ãŒãã®åäœãåé¢ããããã®ã¢ãã¯ãªããžã§ã¯ããã¢ãã¯é¢æ°ãäœæããŸãã
- ã¹ãããã·ã§ãããã¹ãïŒã³ã³ããŒãã³ãã颿°ã®åºåããã£ããã£ãã以åã«ä¿åãããã¹ãããã·ã§ãããšæ¯èŒããŸãã
- ã³ãŒãã«ãã¬ããžïŒãã¹ãã«ãã£ãŠã«ããŒãããŠããã³ãŒãã®å²åãæž¬å®ããŸãã
- ãã¹ãã®äžŠåå®è¡ïŒãã¹ãã䞊åã§å®è¡ããå šäœã®ãã¹ãæéãççž®ããŸãã
äŸ (Jest):
// sum.js
function sum(a, b) {
return a + b;
}
module.exports = sum;
// sum.test.js
const sum = require('./sum');
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
Mocha
Mochaã¯æè»ã§æ¡åŒµå¯èœãªãã¹ããã¬ãŒã ã¯ãŒã¯ã§ãç¬èªã®ã¢ãµãŒã·ã§ã³ã©ã€ãã©ãªïŒäŸïŒChai, AssertïŒãã¢ããã³ã°ã©ã€ãã©ãªïŒäŸïŒSinon.JSïŒãéžæã§ããŸããããã«ããããã¹ãç°å¢ããã现ããå¶åŸ¡ã§ããŸãã
- æè»æ§ïŒå¥œã¿ã®ã¢ãµãŒã·ã§ã³ã©ã€ãã©ãªãšã¢ããã³ã°ã©ã€ãã©ãªãéžæã§ããŸãã
- æ¡åŒµæ§ïŒãã©ã°ã€ã³ãã«ã¹ã¿ã ã¬ããŒã¿ãŒã§Mochaãç°¡åã«æ¡åŒµã§ããŸãã
- éåæãã¹ãïŒéåæã³ãŒãã®ãã¹ãã«åªãããµããŒããæäŸããŸãã
äŸ (MochaãšChai):
// sum.js
function sum(a, b) {
return a + b;
}
module.exports = sum;
// test/sum.test.js
const sum = require('../sum');
const chai = require('chai');
const expect = chai.expect;
describe('Sum', () => {
it('should add 1 + 2 to equal 3', () => {
expect(sum(1, 2)).to.equal(3);
});
});
Jasmine
Jasmineã¯ããã¹ããèšè¿°ããããã®ã¯ãªãŒã³ã§è¡šçŸåè±ããªæ§æãæäŸããããã€ãã¢é§åéçºïŒBDDïŒãã¬ãŒã ã¯ãŒã¯ã§ããAngularJSãAngularã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãã«ãã䜿çšãããŸãã
- BDDæ§æïŒãã¹ãã±ãŒã¹ãå®çŸ©ããããã®æç¢ºã§è¡šçŸåè±ããªæ§æã
- çµã¿èŸŒã¿ã¢ãµãŒã·ã§ã³ïŒè±å¯ãªçµã¿èŸŒã¿ã¢ãµãŒã·ã§ã³ãããã£ãŒãæäŸããŸãã
- ã¹ãã€ïŒé¢æ°åŒã³åºããç£èŠããããã®ã¹ãã€ã®ãµããŒãã
äŸ (Jasmine):
// sum.js
function sum(a, b) {
return a + b;
}
module.exports = sum;
// sum.spec.js
describe('Sum', function() {
it('should add 1 + 2 to equal 3', function() {
expect(sum(1, 2)).toEqual(3);
});
});
Cypress
Cypressã¯ãéçºè ã«åªããäœéšãæäŸããããšã«éç¹ã眮ãã匷åãªãšã³ãããŒãšã³ãïŒE2EïŒãã¹ããã¬ãŒã ã¯ãŒã¯ã§ããå®éã®ãã©ãŠã¶ç°å¢ã§ã¢ããªã±ãŒã·ã§ã³ãšå¯Ÿè©±ãããã¹ããèšè¿°ã§ããŸãã
- ã¿ã€ã ãã©ãã«ïŒåã¹ãããã§ã®ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã確èªããããã«æéãé¡ã£ãŠãã¹ãããããã°ã§ããŸãã
- ãªã¢ã«ã¿ã€ã ãªããŒãïŒã³ãŒãã«å€æŽãå ãããšããã¹ããèªåçã«ãªããŒããããŸãã
- èªååŸ æ©ïŒCypressã¯ãèŠçŽ ã衚瀺ãããã€ã³ã¿ã©ã¯ã·ã§ã³å¯èœã«ãªããŸã§èªåçã«åŸ æ©ããŸãã
äŸ (Cypress):
// cypress/integration/example.spec.js
describe('My First Test', () => {
it('Visits the Kitchen Sink', () => {
cy.visit('https://example.cypress.io');
cy.contains('type').click();
// Should be on a new URL which
// includes '/commands/actions'
cy.url().should('include', '/commands/actions');
// Get an input, type into it and verify
// that the value has been updated
cy.get('.action-email')
.type('fake@email.com')
.should('have.value', 'fake@email.com');
});
});
Playwright
Playwrightã¯ãMicrosoftã«ãã£ãŠéçºãããææ°ã®ãšã³ãããŒãšã³ããã¹ããã¬ãŒã ã¯ãŒã¯ã§ããè€æ°ã®ãã©ãŠã¶ïŒChromium, Firefox, WebKitïŒãšãã©ãããã©ãŒã ïŒWindows, macOS, LinuxïŒããµããŒãããŠããŸããå ç¢ã§ä¿¡é Œæ§ã®é«ããã¹ãã®ããã«ãèªååŸ æ©ããã¬ãŒã¹ããããã¯ãŒã¯ååãªã©ã®æ©èœãæäŸããŸãã
- ã¯ãã¹ãã©ãŠã¶ãã¹ãïŒè€æ°ã®ãã©ãŠã¶ã§ã®ãã¹ãããµããŒãããŸãã
- èªååŸ æ©ïŒèŠçŽ ãã€ã³ã¿ã©ã¯ã·ã§ã³å¯èœã«ãªããŸã§èªåçã«åŸ æ©ããŸãã
- ãã¬ãŒã¹ïŒãããã°ã®ããã«ãã¹ãã®è©³çްãªãã¬ãŒã¹ããã£ããã£ããŸãã
äŸ (Playwright):
// playwright.config.js
module.exports = {
use: {
baseURL: 'https://example.com',
},
};
// tests/example.spec.js
const { test, expect } = require('@playwright/test');
test('has title', async ({ page }) => {
await page.goto('/');
await expect(page).toHaveTitle(/Example Domain/);
});
ãã¹ãã€ã³ãã©ã¹ãã©ã¯ãã£ã®ã»ããã¢ãã
ãã¹ããã¬ãŒã ã¯ãŒã¯ãéžæãããããã¹ãã€ã³ãã©ã¹ãã©ã¯ãã£ãã»ããã¢ããããå¿ èŠããããŸããããã«ã¯éåžžã以äžã®æé ãå«ãŸããŸãïŒ
1. äŸåé¢ä¿ã®ã€ã³ã¹ããŒã«
npmãŸãã¯yarnã䜿çšããŠå¿ èŠãªäŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŸãïŒ
npm install --save-dev jest
yarn add --dev jest
2. ãã¹ããã¬ãŒã ã¯ãŒã¯ã®èšå®
ãã¹ããã¬ãŒã ã¯ãŒã¯çšã®èšå®ãã¡ã€ã«ïŒäŸïŒjest.config.jsãmocha.optsãcypress.jsonïŒãäœæããŸãããã®ãã¡ã€ã«ã«ããããã¹ããã£ã¬ã¯ããªãã¬ããŒã¿ãŒãã°ããŒãã«ã»ããã¢ãããã¡ã€ã«ãªã©ãæå®ããŠããã¹ããã¬ãŒã ã¯ãŒã¯ã®åäœãã«ã¹ã¿ãã€ãºã§ããŸãã
äŸ (jest.config.js):
// jest.config.js
module.exports = {
testEnvironment: 'node',
testMatch: ['**/__tests__/**/*.[jt]s?(x)', '**/?(*.)+(spec|test).[tj]s?(x)'],
collectCoverageFrom: ['src/**/*.{js,jsx,ts,tsx}', '!src/**/*.d.ts'],
moduleNameMapper: {
'^@/(.*)$': '/src/$1',
},
};
3. ãã¹ããã¡ã€ã«ã®äœæ
ã³ãŒãã®ãã¹ããã¡ã€ã«ãäœæããŸãããããã®ãã¡ã€ã«ã«ã¯ãã³ãŒãã®æ©èœãæ€èšŒãããã¹ãã±ãŒã¹ãå«ãŸããŠããå¿
èŠããããŸãããã¹ããã¡ã€ã«ã«ã¯äžè²«ããåœåèŠåïŒäŸïŒ*.test.jsã*.spec.jsïŒã«åŸã£ãŠãã ããã
4. ãã¹ãã®å®è¡
ãã¹ããã¬ãŒã ã¯ãŒã¯ãæäŸããã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããŠãã¹ããå®è¡ããŸãïŒ
npm test
yarn test
JavaScriptãã¹ãã®ãã¹ããã©ã¯ãã£ã¹
ãã¹ãã€ã³ãã©ã¹ãã©ã¯ãã£ã广çã§ä¿å®å¯èœã§ããããšãä¿èšŒããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããïŒ
- ãã¹ãå¯èœãªã³ãŒããæžãïŒã³ãŒããç°¡åã«ãã¹ãã§ããããã«èšèšããŸããäŸåæ§æ³šå ¥ã䜿çšããã°ããŒãã«ãªç¶æ ãé¿ãã颿°ãå°ããéäžãããŸãã
- æç¢ºã§ç°¡æœãªãã¹ããæžãïŒãã¹ããçè§£ãããããä¿å®ããããããŸãããã¹ãã±ãŒã¹ã«ã¯èª¬æçãªååã䜿ãããã¹ãå ã®è€éãªããžãã¯ãé¿ããŸãã
- ãšããžã±ãŒã¹ãšãšã©ãŒæ¡ä»¶ããã¹ãããïŒããããŒãã¹ã ãããã¹ãããªãã§ãã ããããšããžã±ãŒã¹ããšã©ãŒæ¡ä»¶ãå¢çå€ãå¿ ããã¹ãããŠãã ããã
- ãã¹ããé«éã«ä¿ã€ïŒé ããã¹ãã¯éçºããã»ã¹ãå€§å¹ ã«é ãããå¯èœæ§ããããŸããå€éšäŸåãã¢ãã¯ããäžèŠãªé å»¶ãé¿ããããšã§ããã¹ããè¿ éã«å®è¡ããããã«æé©åããŸãã
- ã³ãŒãã«ãã¬ããžããŒã«ã䜿çšããïŒã³ãŒãã«ãã¬ããžããŒã«ã¯ãã³ãŒãã®ååã«ãã¹ããããŠããªãé åãç¹å®ããã®ã«åœ¹ç«ã¡ãŸããé«ãã³ãŒãã«ãã¬ããžãç®æããŸãããç²ç®çã«æ°åã远ããããªãã§ãã ãããéèŠãªæ©èœãã«ããŒããæå³ã®ãããã¹ããæžãããšã«éäžããŠãã ããã
- ãã¹ããèªååããïŒãã¹ããCI/CDãã€ãã©ã€ã³ã«çµ±åããã³ãŒãã®å€æŽããšã«èªåçã«å®è¡ãããããã«ããŸãã
ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒCIïŒãšã®çµ±å
ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒCIïŒã¯ãçŸä»£ã®ãœãããŠã§ã¢éçºã¯ãŒã¯ãããŒã®éèŠãªéšåã§ãããã¹ããCIã·ã¹ãã ãšçµ±åããããšã§ãã³ãŒãã®å€æŽããšã«ãã¹ããèªåçã«å®è¡ããã³ãŒãã®å質ã«é¢ãã峿ã®ãã£ãŒãããã¯ãåŸãããšãã§ããŸãã人æ°ã®ããCIã·ã¹ãã ã«ã¯ä»¥äžããããŸãïŒ
- JenkinsïŒåºã䜿çšãããŠãããªãŒãã³ãœãŒã¹ã®CIãµãŒããŒã
- GitHub ActionsïŒGitHubãšçµ±åãããCI/CDãã©ãããã©ãŒã ã
- Travis CIïŒã¯ã©ãŠãããŒã¹ã®CIãµãŒãã¹ã
- CircleCIïŒããäžã€ã®äººæ°ã®ããã¯ã©ãŠãããŒã¹ã®CIãµãŒãã¹ã
- GitLab CIïŒGitLabã«çµã¿èŸŒãŸããCI/CDã
ãã¹ããCIã·ã¹ãã ãšçµ±åããã«ã¯ãéåžžãCIã·ã¹ãã ãå®è¡ããæé ãæå®ããèšå®ãã¡ã€ã«ïŒäŸïŒ.github/workflows/main.ymlã.travis.ymlã.gitlab-ci.ymlïŒãäœæããå¿
èŠããããŸããããã«ã¯ãäŸåé¢ä¿ã®ã€ã³ã¹ããŒã«ããã¹ãã®å®è¡ãã³ãŒãã«ãã¬ããžããŒã¿ã®åéãªã©ãå«ãŸããŸãã
äŸ (.github/workflows/main.yml):
# .github/workflows/main.yml
name: Node.js CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x, 16.x, 18.x]
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- name: Install Dependencies
run: npm ci
- name: Run Tests
run: npm test
- name: Code Coverage
run: npm run coverage
é«åºŠãªãã¹ãæè¡
åºæ¬ãè¶ ããŠããã¹ãã€ã³ãã©ã¹ãã©ã¯ãã£ãããã«åŒ·åã§ããããã€ãã®é«åºŠãªãã¹ãæè¡ããããŸãïŒ
- ããããã£ããŒã¹ãã¹ãïŒãã®æè¡ã¯ãã³ãŒããæºããã¹ãããããã£ãå®çŸ©ãããããã®ããããã£ããã¹ãããããã«ã©ã³ãã ãªå ¥åãçæããããšãå«ã¿ãŸãã
- ãã¥ãŒããŒã·ã§ã³ãã¹ãïŒãã®æè¡ã¯ãã³ãŒãã«å°ããªå€æŽïŒãã¥ãŒããŒã·ã§ã³ïŒãå ãããã¹ãããã®ãã¥ãŒããŒã·ã§ã³ãæ€åºã§ãããã確èªããŸããããã«ããããã¹ããæå³ãããã®ãå®éã«ãã¹ãããŠããããšã確èªã§ããŸãã
- ããžã¥ã¢ã«ãã¹ãïŒãã®æè¡ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¹ã¯ãªãŒã³ã·ã§ãããããŒã¹ã©ã€ã³ç»åãšæ¯èŒããŠãèŠèŠçãªãªã°ã¬ãã·ã§ã³ãæ€åºããŸãã
åœéåïŒi18nïŒãšå°ååïŒl10nïŒãã¹ã
ã¢ããªã±ãŒã·ã§ã³ãè€æ°ã®èšèªãšå°åããµããŒãããŠããå Žåããã®åœéåïŒi18nïŒãšå°ååïŒl10nïŒã®æ©èœããã¹ãããããšãäžå¯æ¬ ã§ããããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã以äžã®ããšãæ€èšŒããããšãå«ãŸããŸãïŒ
- ç°ãªãèšèªã§ããã¹ããæ£ãã衚瀺ããã
- ç°ãªãæ¥ä»ãæå»ãæ°å€ã®åœ¢åŒãåŠçããã
- ç°ãªãæåçãªæ £ç¿ã«é©å¿ããã
i18nextãFormatJSãLinguiJSã®ãããªããŒã«ã¯ãi18nãšl10nã«åœ¹ç«ã¡ãŸãããã¹ãã§ã¯ããããã®ããŒã«ãæ£ããçµ±åãããã¢ããªã±ãŒã·ã§ã³ãç°ãªããã±ãŒã«ã§æåŸ
ã©ããã«åäœããããšã確èªããå¿
èŠããããŸãã
äŸãã°ãç°ãªãå°åã§æ¥ä»ãæ£ãã圢åŒã§è¡šç€ºãããããšãæ€èšŒãããã¹ãããããããããŸããïŒ
// Example using Moment.js
const moment = require('moment');
test('Date format should be correct for Germany', () => {
moment.locale('de');
const date = new Date(2023, 0, 1, 12, 0, 0);
expect(moment(date).format('L')).toBe('01.01.2023');
});
test('Date format should be correct for the United States', () => {
moment.locale('en-US');
const date = new Date(2023, 0, 1, 12, 0, 0);
expect(moment(date).format('L')).toBe('01/01/2023');
});
ã¢ã¯ã»ã·ããªãã£ãã¹ã
é害ãæã€ãŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ã§ããããã«ããããšã¯éåžžã«éèŠã§ããã¢ã¯ã»ã·ããªãã£ãã¹ãã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãWCAGïŒWeb Content Accessibility GuidelinesïŒã®ãããªã¢ã¯ã»ã·ããªãã£åºæºã«æºæ ããŠããããšãæ€èšŒããããšãå«ãŸããŸãã
axe-coreãLighthouseãPa11yã®ãããªããŒã«ã¯ãã¢ã¯ã»ã·ããªãã£ãã¹ãã®èªååã«åœ¹ç«ã¡ãŸãããã¹ãã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã以äžã®ããšãæ€èšŒããå¿
èŠããããŸãïŒ
- ç»åã«é©åãªä»£æ¿ããã¹ããæäŸããã
- ã»ãã³ãã£ãã¯ãªHTMLèŠçŽ ã䜿çšããã
- ååãªè²ã®ã³ã³ãã©ã¹ããããã
- ããŒããŒãã䜿çšããŠããã²ãŒãã§ããã
äŸãã°ãCypressãã¹ãã§axe-coreã䜿çšããŠãã¢ã¯ã»ã·ããªãã£éåããã§ãã¯ã§ããŸãïŒ
// cypress/integration/accessibility.spec.js
import 'cypress-axe';
describe('Accessibility check', () => {
it('Checks for accessibility violations', () => {
cy.visit('https://example.com');
cy.injectAxe();
cy.checkA11y(); // Checks the entire page
});
});
ããã©ãŒãã³ã¹ãã¹ã
ããã©ãŒãã³ã¹ãã¹ãã¯ãã¢ããªã±ãŒã·ã§ã³ãå¿çæ§ãé«ãå¹ççã§ããããšãä¿èšŒããŸããããã«ã¯ä»¥äžãå«ãŸããŸãïŒ
- è² è·ãã¹ãïŒå€æ°ã®åæãŠãŒã¶ãŒãã·ãã¥ã¬ãŒãããŠãã¢ããªã±ãŒã·ã§ã³ãé«è² è·äžã§ã©ã®ããã«åäœãããã確èªããŸãã
- ã¹ãã¬ã¹ãã¹ãïŒã¢ããªã±ãŒã·ã§ã³ãéçãè¶ ããŠããã·ã¥ããç Žå£ç¹ãèŠã€ãåºããŸãã
- ããã©ãŒãã³ã¹ãããã¡ã€ãªã³ã°ïŒã³ãŒãå ã®ããã©ãŒãã³ã¹ããã«ããã¯ãç¹å®ããŸãã
LighthouseãWebPageTestãk6ã®ãããªããŒã«ã¯ãããã©ãŒãã³ã¹ãã¹ãã«åœ¹ç«ã¡ãŸãããã¹ãã§ã¯ãã¢ããªã±ãŒã·ã§ã³ãè¿
éã«ããŒãããããŠãŒã¶ãŒã®æäœã«è¿
éã«å¿çããå¹ççã«ã¹ã±ãŒã«ããããšã確èªããå¿
èŠããããŸãã
ã¢ãã€ã«ãã¹ã
ã¢ããªã±ãŒã·ã§ã³ãã¢ãã€ã«ããã€ã¹åãã«èšèšãããŠããå Žåã¯ãã¢ãã€ã«ãã¹ãã宿œããå¿ èŠããããŸããããã«ã¯ãããŸããŸãªç»é¢ãµã€ãºãè§£ååºŠã§æ£ããåäœããããšã確èªããããã«ãç°ãªãã¢ãã€ã«ããã€ã¹ããšãã¥ã¬ãŒã¿ã§ã¢ããªã±ãŒã·ã§ã³ããã¹ãããããšãå«ãŸããŸãã
AppiumãBrowserStackã®ãããªããŒã«ã¯ãã¢ãã€ã«ãã¹ãã«åœ¹ç«ã¡ãŸãããã¹ãã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã以äžã®ããšãæ€èšŒããå¿
èŠããããŸãïŒ
- ã¿ããã€ãã³ãã«æ£ããå¿çããã
- ç°ãªãç»é¢ã®åãã«é©å¿ããã
- ã¢ãã€ã«ããã€ã¹ã§ãªãœãŒã¹ãå¹ççã«æ¶è²»ããã
ã»ãã¥ãªãã£ãã¹ã
ã»ãã¥ãªãã£ãã¹ãã¯ãã¢ããªã±ãŒã·ã§ã³ãšãŠãŒã¶ãŒããŒã¿ãè匱æ§ããä¿è·ããããã«äžå¯æ¬ ã§ããããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã以äžã®ãããªäžè¬çãªã»ãã¥ãªãã£äžã®æ¬ é¥ã«ã€ããŠãã¹ãããããšãå«ãŸããŸãïŒ
- ã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ïŒXSSïŒïŒã¢ããªã±ãŒã·ã§ã³ã«æªæã®ããã¹ã¯ãªãããæ³šå ¥ããã
- SQLã€ã³ãžã§ã¯ã·ã§ã³ïŒããŒã¿ããŒã¹ã¯ãšãªã®è匱æ§ãæªçšããã
- ã¯ãã¹ãµã€ããªã¯ãšã¹ããã©ãŒãžã§ãªïŒCSRFïŒïŒãŠãŒã¶ãŒã«æå³ããªãã¢ã¯ã·ã§ã³ãå®è¡ãããã
OWASP ZAPãSnykã®ãããªããŒã«ã¯ãã»ãã¥ãªãã£ãã¹ãã«åœ¹ç«ã¡ãŸãããã¹ãã§ã¯ãã¢ããªã±ãŒã·ã§ã³ãäžè¬çãªã»ãã¥ãªãã£æ»æã«å¯ŸããŠèæ§ãããããšãæ€èšŒããå¿
èŠããããŸãã
ãŸãšã
å ç¢ãªJavaScriptãã¹ãã€ã³ãã©ã¹ãã©ã¯ãã£ã®å®è£ ã¯ãã³ãŒãã®å質ãšä¿¡é Œæ§ãžã®éèŠãªæè³ã§ãããã®ã¬ã€ãã§æŠèª¬ããã¬ã€ãã©ã€ã³ãšãã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãèªä¿¡ãæã£ãŠé«å質ãªJavaScriptã¢ããªã±ãŒã·ã§ã³ãéçºã§ãããã¹ãã€ã³ãã©ã¹ãã©ã¯ãã£ãæ§ç¯ã§ããŸããããŒãºã«åã£ãé©åãªãã¬ãŒã ã¯ãŒã¯ãéžæããæç¢ºã§ç°¡æœãªãã¹ããèšè¿°ãããã¹ããCIã·ã¹ãã ãšçµ±åãããã¹ãããã»ã¹ãç¶ç¶çã«æ¹åããããšãå¿ããªãã§ãã ãããå æ¬çãªãã¹ãã€ã³ãã©ã¹ãã©ã¯ãã£ãžã®æè³ã¯ããã°ã®åæžãã³ãŒãå質ã®åäžãéçºãµã€ã¯ã«ã®å éã«ãããé·æçã«ã¯å€§ããªå©çãããããã§ãããã